package br.com.tcc.systemdx.service.beans;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import br.com.tcc.systemdx.domain.DescricaoDoenca;
import br.com.tcc.systemdx.domain.Sintoma;

/**
 * POJO simples para representação de produtos cartesianos de conjuntos, ou seja,
 * gerador de novos conjuntos.
 * @author Felipe
 *
 */
public class GeradorConjuntos {
	
	/**
	 * Contém os elementos do produto cartesiano
	 */
	private List<Set<DescricaoDoenca>> elementosProduto;
	
	/**
	 * Todos os sintomas abrangidos pelo produto cartesiano
	 */
	private Set<Sintoma> sintomasAbrangidos;

	public void setElementosProduto(List<Set<DescricaoDoenca>> elementosProduto) {
		this.elementosProduto = elementosProduto;
	}

	public List<Set<DescricaoDoenca>> getElementosProduto() {
		return elementosProduto;
	}
	
	/**
	 * Identifica se o gerador em questão é simples, ou seja, não é um produto
	 * cartesiano de conjuntos. Isso acontece quando só há um elemento em 
	 * elementosProduto
	 * @return  true se simples e false caso contrário
	 */
	public boolean isGeradorSimples() {
		if (elementosProduto != null && elementosProduto.size() == 1)
			return true;
		return false;
	}

	public void setSintomasAbrangidos(Set<Sintoma> sintomasAbrangidos) {
		this.sintomasAbrangidos = sintomasAbrangidos;
	}

	public Set<Sintoma> getSintomasAbrangidos() {
		return sintomasAbrangidos;
	}
	
	/**
	 * Retorna todas as doenças do gerador
	 * @return
	 */
	public Set<DescricaoDoenca> getDoencas() {
		Set<DescricaoDoenca> doencasSet = new HashSet<DescricaoDoenca>();
		if (elementosProduto != null) {
			for (Set<DescricaoDoenca> elementos : elementosProduto) {
				doencasSet.addAll(elementos);
			}
		}
		return doencasSet;
	}
	
	/**
	 * Verifica se uma descrição doença já está presente no gerador
	 * @param doenca
	 * @return
	 */
	public boolean isDoencaPresente(DescricaoDoenca doenca) {
		for (DescricaoDoenca dd : getDoencas()) {
			if (dd.equals(doenca))
				return true;
		}
		return false;
	}
	
	/**
	 * Verifica se qualquer uma das doencas passadas já está presente no gerador
	 * @param doencas
	 * @return
	 */
	public boolean isAlgumaDoencaPresente(List<DescricaoDoenca> doencas) {
		for (DescricaoDoenca doenca : doencas) {
			if (isDoencaPresente(doenca))
				return true;
		}
		return false;
	}
	
	@Override
	public String toString() {
		StringBuilder str = new StringBuilder();
		int contador = 0;
		str.append("<p>");
		str.append("Gerador: <br/>");
		for (Set<DescricaoDoenca> elemento : elementosProduto) {
			if (contador != 0) {
				str.append("& <br/>");
			}
			contador++;
			for (DescricaoDoenca doenca : elemento) {
				str.append(doenca.getTitulo());
				str.append("<br/>");
			}
		}
		str.append("</p>");
		return str.toString();
	}

}
